from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import QMovie, QImage, QPixmap
from UI设计 import *
import sys,os
# 1、导入模块 sqlite3
import sqlite3

# import cv2 #模块安装 pip install opencv-python
'''
["glob","*无理由*"]
["glob","*7天*"]
["glob","*退货*"]
["glob","*收藏*"]
["glob","*加购*"]
["glob","*退换*"] 慎用

'''



class my_thaerd(QThread):
    timer = pyqtSignal(int)  # 定义一个能传递int类型的信号①
    def run(self):
        self.conn = sqlite3.connect(sql_file[0])
        self.cur = self.conn.cursor()
        # 获得待删除图片路径
        delete_list = self.cur.execute("select * from 待删除图片").fetchall()
        # B_delete_list = self.cur.execute("select * from 图片识别表").fetchall()
        total = len(self.cur.execute("select * from 待删除图片").fetchall())
        n=0
        for i in delete_list:
            print(i)
            sql='DELETE FROM 待删除图片 WHERE id =?'
            data=(i[0],)
            self.cur.execute(sql,data)
            sql = 'DELETE FROM 图片识别表 WHERE id =?'
            data = (i[0],)
            self.cur.execute(sql, data)
            filename=i[1]
            if (os.path.exists(r"%s"%filename)):
                os.remove(r"%s"%filename)
                print(r'正在删除%s' % filename)
            self.conn.commit()
            self.timer.emit((n / total) * 100)
            # self.sleep(1)
            n+=1
        self.timer.emit(100)


class ui(QMainWindow):
    def __init__(self, parent=None):
        super(ui, self).__init__(parent)
        self.ui = Ui_MainWindow()  # 关键点
        self.ui.setupUi(self)  # 关键点

        self.ui.textEdit.setPlaceholderText("请输入sqlite查询条件 例如： '[\"查询模式\",\"关键字\"]' 前面是查询方式，后面是查询文本")
        self.ui.lineEdit.setPlaceholderText("请选择Sqlite文件")

        # 点击信号绑定
        self.ui.listView_2.clicked.connect(self.sselect_image)
        # 点击信号绑定
        self.ui.listView_3.clicked.connect(self.sselect_image)

        #选择sqlte文件
        self.ui.pushButton_2.clicked.connect(self.select_file)
        #筛选关键词
        self.ui.pushButton.clicked.connect(self.get_textEdit_list)
        #删除文件按钮
        self.ui.delete_2.clicked.connect(self.delete_images_file)
        #恢复按钮
        self.ui.pushButton_3.clicked.connect(self.Revoke)

        #定义多线程
        self.thaerd = my_thaerd()
        self.thaerd.timer.connect(self.update_bar_nmber)

    def delete_images_file(self):
        self.thaerd.start()

    #同步显示ui数据
    def update_bar_nmber(self,item):
        print('接收到信号%d'%item)
        self.ui.label_5.setText('待删除文件 %d个' % len(self.cur.execute("select * from 待删除图片").fetchall()))
        # self.ui.label_4.setText('数据库文件 %d个' % len(self.cur.execute("select * from 图片识别表").fetchall()))
        self.ui.progressBar.setValue(item)
        # self.add_data_list_laft()
        self.get_delete_sqldata()


    def select_file(self):
        filename, _ = QFileDialog.getOpenFileName(self, "打开文件", ".", "sql文件 (*.sql *.db *.sqlite)")
        print(filename)# 如果文件名不等于空，就加载图片
        sql_file[0]=filename
        if filename != '':
            # self.imageLabel.setPixmap(QPixmap(filename))
            print(filename)
            self.ui.lineEdit.setText(filename)
            # 3、获取与数据库的连接
            self.conn = sqlite3.connect(filename)
            self.cur = self.conn.cursor()
            try:
                tabel_name=self.cur.execute('SELECT name FROM sqlite_master WHERE type="table" order by name').fetchall()
            except sqlite3.DatabaseError:
                QMessageBox.warning(self,
                                    "数据库字段有误",
                                    "请检查是不是选错了数据库文件！",
                                    QMessageBox.Yes | QMessageBox.No)
                return

            #获取表名
            if 'equence' in tabel_name[0][0]:
                self.data_tabel_name=tabel_name[1][0]
            else:
                self.data_tabel_name = tabel_name[0][0]

            self.add_data_list_laft()



    def add_data_list_laft(self):
        sql = "select * from %s" % (self.data_tabel_name)  # 返回结果是这样的格式 [('score',), ('sqlite_sequence',)]，所以要[0][0]
        self.cur.execute(sql)
        # 6、打印结果
        # print( self.cur.fetchall())
        data = self.cur.fetchall()
        # 创建个modell容器
        listModel = QStringListModel()
        self.text_list=[]
        self.data_list=[] #为listModel准备list数据用于展示
        for i in data:
            self.data_list.append(i[1])
            self.text_list.append(i[2])
            print('正在添加数据'+ str(i))
        #往容器中添加数据
        listModel.setStringList(self.data_list)
        self.ui.label_4.setText('数据库文件 %d个'%len(self.cur.execute("select * from 图片识别表" ).fetchall()))
        #view控件的容器设置成添加好数据的容器
        self.ui.listView_2.setModel(listModel)

        #右边也添加之前未完成的任务
        try:
            # 把待删除数据显示到右侧的view中
            self.get_delete_sqldata()
        except:
            print("数据库中还有没待删除的表...")




    #选择图片路径
    def sselect_image(self,item):
        #判断是谁发过来的信号，做出不同的操作
        if self.sender().objectName()=='listView_2':
            fileName=self.data_list[item.row()]#获取点击的是哪一行data_list数据
            text=self.text_list[item.row()]
        else:
            fileName = self.data_list2[item.row()]  # 获取点击的是哪一行data_list数据
            text = self.text_list2[item.row()]

        print(item.row())
        self.show_image(fileName)
        self.show_text(text)
    #显示图片
    # 设置label的大小
    # self.ui.images.setBaseSize(300,300)
    def show_image(self,fileName):
        print(fileName)
        self.Qimg_file = QPixmap(fileName)  # .scaled(500,500) #设置图片大小
        self.ui.images.setPixmap(self.Qimg_file)
        self.ui.images.setScaledContents(True)  ## 让图片自适应label大小
    #设置文本
    def show_text(self,text):
        self.ui.label_2.setText(text)



    #获取筛选关键词列表
    def get_textEdit_list(self):
        #清除原数据
        ret=self.clier_data()
        #获取多行文本框里面的内容，还有其他方法，比如获取HTMl等。
        if ret!=2:
            text=self.ui.textEdit.toPlainText()
            text_list=text.split('\n')
            for i in text_list:
                self.find_key_word=i
                #调用筛选关键词
                self.file_text()
                print(i)

    # 筛选关键词
    def file_text(self):

        key_list = eval(self.find_key_word)
        sql = "select * from %s where 识别结果 %s '%s'" % (self.data_tabel_name, key_list[0], key_list[1])
        print('sql语句是%s' % sql)
        file_list = self.cur.execute(sql).fetchall()
        sql_data_list=[]
        for i in file_list:
            sql_data_list.append(i)


        #验证表是否存在，没有就新建
        self.new_Sql_table()
        #筛选出的待删除数据写入到数据库中
        self.add_data_on_sql(sql_data_list)
        # 把待删除数据显示到右侧的view中
        self.get_delete_sqldata()
        #把待删除列表从左侧数据库中清除

    def add_data_on_sql(self,sql_data_list):
        for i in sql_data_list:
            #右侧增加数据
            sql = "insert into 待删除图片 (ID,待删除图片路径,识别结果) values ('%d','%s','%s')"%(i[0],i[1],i[2])
            self.cur.execute(sql)
            #左侧删除数据
            sql = 'DELETE FROM 图片识别表 WHERE id =?'
            data = (i[0],)
            self.cur.execute(sql, data)

        self.conn.commit()
        self.ui.label_5.setText('待删除文件 %d个' % len(self.cur.execute("select * from 待删除图片").fetchall()))
        self.ui.label_4.setText('数据库文件 %d个'%len(self.cur.execute("select * from 图片识别表" ).fetchall()))

    def new_Sql_table(self):
        try:
            self.cur.execute('CREATE TABLE 待删除图片(ID INTEGER PRIMARY KEY AUTOINCREMENT,待删除图片路径 TEXT,识别结果 TEXT)')
        except:
            print('表已经新建过了，可以直接添加数据')

    # 把待删除数据显示到右侧的view中
    def get_delete_sqldata(self):
        self.delete_data=self.cur.execute("select * from 待删除图片" ).fetchall()
        print(self.delete_data)
        data_list = []
        text_list=[]
        # 创建个modell容器
        listModel = QStringListModel()
        for i in self.delete_data:
            data_list.append(i[1])
            text_list.append(i[2])
        # 往容器中添加数据
        listModel.setStringList(data_list)
        #给右侧列表返回索引用
        self.data_list2 = data_list
        self.text_list2=text_list
        # view控件的容器设置成添加好数据的容器
        self.ui.listView_3.setModel(listModel)
        self.ui.label_5.setText('待删除文件 %d个' % len(self.cur.execute("select * from 待删除图片").fetchall()))


    def openMessageBox(self,message):
        '''
        ok=1024
        Cancel=4194304
        NO=65536
        '''
        msgBox = QMessageBox()
        msgBox.setText(u'%s'%message)
        msgBox.addButton(QMessageBox.Ok)
        msgBox.addButton(QMessageBox.No)
        msgBox.addButton(QMessageBox.Cancel)
        ret = msgBox.exec_()
        return ret

    def clier_data(self):
        # 验证表是否存在，没有就新建
        self.new_Sql_table()
        if self.cur.execute("select * from 待删除图片" ).fetchall()!=[]:
            ret=self.openMessageBox('要先清除之前的数据重新筛选数据吗？')
            print(ret)#ok=1024 取消=4194304
            if ret==1024:
                #先恢复一下
                self.Revoke()
                sql='DELETE FROM 待删除图片 WHERE ID >=0'
                self.cur.execute(sql)
                self.conn.commit()
                #self.openMessageBox('数据库>待删除图片表中的数据已清空!')
            elif ret==65536:
                return 0
            else:
                return 2#告诉下一个进度，取消此次操作
            self.ui.label_5.setText('待删除文件 %d个' % len(self.cur.execute("select * from 待删除图片").fetchall()))

    def Revoke(self):
        self.delete_data = self.cur.execute("select * from 待删除图片").fetchall()
        print(self.delete_data)
        # 创建个modell容器
        listModel = QStringListModel()
        data_list=[]
        for i in self.delete_data:
            data_list.append(i)
            sql = "insert into 图片识别表 (ID,图片地址,识别结果) values (?,?,?)"
            data = (i[0],i[1],i[2])
            self.cur.execute(sql, data)
            sql = 'DELETE FROM 待删除图片 WHERE id =?'
            data = (i[0],)
            self.cur.execute(sql, data)
        self.conn.commit()
        self.add_data_list_laft()
        self.get_delete_sqldata()


if __name__ == '__main__':
    app=QApplication(sys.argv)
    windows=ui()
    sql_file=[0]
    windows.show()
    sys.exit(app.exec())